package main

import (
	"fmt"
	"sync"
	"time"
)


type button struct{
	clicked *sync.Cond
}
// 因为打印的结果是先有三个 ：是不是同一个锁的？
// 于是 我们可以得出结论，这三个协和看起来就是用同一个锁进行锁定的。
// TODO：但是一个锁不是在进行上锁之后，其余的人想要继续上锁必需等上锁的人解锁才行吗？没有搞懂
func main(){
	btn := button{clicked: sync.NewCond(&sync.Mutex{})}
	subscribe := func(c *sync.Cond, fn func()){
		// 这块用上 sync.WaitGroup 并且在进到goroutine中就背单词done掉，就是为了能让这几个goroutine运行到c.wait（）处，可以在c.broadcast前停上几秒来保证。
		//var goroutineRuning sync.WaitGroup
		//goroutineRuning.Add(1)
		go func(){
			//defer goroutineRuning.Done()
			c.L.Lock()
			fmt.Println("是不是同是锁的？")
			defer c.L.Unlock()
			c.Wait()
			fn()
		}()
		//goroutineRuning.Wait()
	}

	var clicckRegistered sync.WaitGroup
	clicckRegistered.Add(3)
	subscribe(btn.clicked, func(){
		fmt.Println("max")
		clicckRegistered.Done()
	})
	subscribe(btn.clicked, func() {
		fmt.Println("displaying")
		clicckRegistered.Done()
	})
	subscribe(btn.clicked, func() {
		fmt.Println("mouse")
		clicckRegistered.Done()
	})
	time.Sleep(3*time.Second)
	btn.clicked.Broadcast()
	clicckRegistered.Wait()
	
	
}